//
//  YMSHomeViewModel.swift
//  YMSWeibo
//
//  Created by 杨茂盛 on 2016/11/16.
//  Copyright © 2016年 杨茂盛. All rights reserved.
//

import UIKit
import YYModel
import SDWebImage
class YMSHomeViewModel: NSObject {
    
    //把model放到viewModel中
    lazy var viewModelArray:[YMSStatusesViewModel] = [YMSStatusesViewModel]()
//-------------------------获取数据-------------------------------------------------
    //MARK: 加载数据
    func loadData(isPull:Bool,finished:@escaping (Bool,Int) -> ()){
        //想要加载用户的信息,需要两个条件
//        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
     
        //print(urlString,parameters)
        
//--------------------------上拉操作------------------------------------
        var maxId:Int64 = 0
        var sinceId : Int64 = 0
        //如果是上拉
        if isPull {
            maxId = viewModelArray.last?.status?.id ?? 0
            if maxId != 0 {
                maxId -= 1 //因为后边要数据,是一个模型,两个模型添加在一起会有一条数据重复,要从倒数第一个开始添加
            }
        }else{
            sinceId = viewModelArray.first?.status?.id ?? 0
        }
  
//使用YMSStatusDal来完成数据的请求
        YMSStatusDal.loadHomeData(sinceId: sinceId, maxId: maxId) { (array) in
            //如果数组为空 请求失败
            if array == nil {
            finished(false,0)
                return
            }
            //请求成功
            var tempArray = [YMSStatusesViewModel]()
            for item in array!{
            let viewModel = YMSStatusesViewModel()
                let s = YMSStatuses()
                s.yy_modelSet(with: item)
                viewModel.status = s
                
                //MARK: 根据viewModel来计算行高
                //1.根据viewmodel获取cell
                let cell = self.loadCell(viewmodel: viewModel)
                //给cell的viewmdel赋值
                cell.viewModel = viewModel
                //强制提前刷新cell
                cell.layoutIfNeeded()
                //获取tabBar的最大Y值
                viewModel.rowHeight = cell.toolbar.frame.maxY
                
            tempArray.append(viewModel)
            }
            //执行成功的回调
            //如果是上拉就加载更多数据
            if isPull{
            self.viewModelArray = self.viewModelArray + tempArray
                
            }else{
                
            self.viewModelArray = tempArray + self.viewModelArray
                
            }
            self.cacheStatusSingleImage(array: tempArray, finished: finished)
            finished(true,tempArray.count)
        }
    }
    
//        
//        //发送请求
//        YMSNetWorkToll.shared.request(method: .GET, urlString: urlString, parameters: parameters) { (responsed, error) in
//            
//            if error != nil {
//               finished(false,0)
//                return
//            }
//            //这里一定能够获取到值
//            //print(responsed)
//            
////--------------------------把获取到的数据转换为模型------------------------------------
//            
//            //根据数据结构,最外层是一个字典,先把数据转换为一个字典
//            let dict = responsed as! [String:Any]
//            
//            //转换为字典数组,拿到里面的status 把获取到的字典存放到数组中去
//            guard let array = dict["statuses"] as? [[String:Any]] else{
//                //SVProgressHUD.showError(withStatus: errorTip)
//                finished(false,0)
//                return
//            }
//            //遍历一下数组,看是否正确
//            // print(array)
//            
//            
//           
//            //测试存储微博数据
//            YMSStatusDal.cacheStauts(array: array)
//            
//
////--------------------------遍历数组,字典转模型---------------------------------------
//            
//            var tempArray = [YMSStatusesViewModel]()
//            for item in array{
//                let viewModel = YMSStatusesViewModel()
//                let s = YMSStatuses()
//                //YYModel转换
//                s.yy_modelSet(with: item)
//                viewModel.status = s
//                //把模型添加到临时数组中去
//                tempArray.append(viewModel)
//            }
//            
//            //如果是上拉 就应该在后边添加以前的数据
//            if isPull {
//            //追加数据
//                self.viewModelArray = self.viewModelArray + tempArray
//            }else
//            {
//            //初次的时候直接赋值, 或者下拉刷新的时候 执行插入到前面操作
//                self.viewModelArray = tempArray + self.viewModelArray
//            }
//            //完成回调
//            //finished(true,tempArray.count)
//            //print(self.viewModelArray)
//            self.cacheStatusSingleImage(array: tempArray, finished:finished)
//        }
//    }
//--------------------------缓存单张照片---------------------------------------------
    private func cacheStatusSingleImage(array:[YMSStatusesViewModel],finished:@escaping (Bool,Int) ->()){
        if array.count == 0 {
            //一定要执行回调
            finished(true,0)
            return
        }
        //遍历视图模型
        //使用调度组
        let group = DispatchGroup()
        for viewModel in array{
            if viewModel.imageUrls?.count == 1 {
                //如果只有一张图片
                //异步下载图片的操作
                //希望所有的异步任务结束完之后再执行回调
                //在开始任务之前,执行入组的操作,调度组中的任务+1
                group.enter() //加入
                let url = URL(string: viewModel.imageUrls?.first?.wap360 ?? "")
                SDWebImageManager.shared().downloadImage(with: url, options: [], progress: nil, completed: { (_, _, _, _, _) in
                    print("----单张图片下载成功")
                    //要出组 任务-1
                    group.leave()
                })
            }
        }
        group.notify(queue: DispatchQueue.main, execute: {
            print("所有的图片都下载完毕")
            finished(true,array.count)
        })
    }
    
    //载入一个cell
    private func loadCell(viewmodel:YMSStatusesViewModel) -> YMSStatusCell{
        //根据外界传来的一个视图模型,返回一个cell
        return (viewmodel.status?.retweeted_status == nil) ? orginalCell:reweentedCell
    }

}
